package com.five.mobile.exception;

import com.five.core.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice(basePackages = "com.five.mobile.controller")
@Slf4j
public class MobileGlobalExceptionHandler {

    /**
     * 处理Dubbo远程调用抛出的RuntimeException（包装了CustomerException）
     */
    @ExceptionHandler(RuntimeException.class)
    public Result handleDubboRuntimeException(RuntimeException e) {
        log.error("远程调用异常：", e);
        String errorMsg = e.getMessage();

        // 步骤1：检查是否包含CustomerException特征
        if (errorMsg != null && errorMsg.contains("com.five.core.exception.CustomerException")) {
            // 步骤2：提取业务消息（格式："xxx.CustomerException: 订单状态不允许收货"）
            String businessMsg = extractBusinessMsg(errorMsg);
            // 步骤3：返回提取到的业务消息（无需code匹配，直接返回具体描述）
            return Result.buildFail(businessMsg);
        }

        // 非业务异常：返回简化提示
        return Result.buildFail("系统异常: " + getSimpleErrorMessage(e));
    }

    /**
     * 从异常消息中提取业务描述（如"订单状态不允许收货"）
     */
    private String extractBusinessMsg(String errorMsg) {
        try {
            // 步骤1：提取": "或":"后的原始内容（包含可能的堆栈）
            String rawMsg = null;
            int colonSpaceIndex = errorMsg.indexOf(": ");
            if (colonSpaceIndex != -1) {
                rawMsg = errorMsg.substring(colonSpaceIndex + 2).trim();
            } else {
                int colonIndex = errorMsg.indexOf(":");
                if (colonIndex != -1) {
                    rawMsg = errorMsg.substring(colonIndex + 1).trim();
                }
            }

            if (rawMsg == null) {
                return "业务处理失败，请检查请求";
            }

            // 步骤2：截断第一个换行符（\r\n或\n）后的堆栈信息
            int lineBreakIndex = rawMsg.indexOf("\r\n");
            if (lineBreakIndex == -1) {
                lineBreakIndex = rawMsg.indexOf("\n"); // 兼容不同换行符
            }
            if (lineBreakIndex != -1) {
                return rawMsg.substring(0, lineBreakIndex).trim(); // 只保留换行前的业务消息
            }

            // 没有换行符，直接返回提取的内容
            return rawMsg;

        } catch (Exception ex) {
            log.warn("提取业务消息失败", ex);
            return "业务处理失败，请检查请求";
        }
    }

    /**
     * 获取简化的错误信息（避免返回堆栈）
     */
    private String getSimpleErrorMessage(Throwable e) {
        if (e == null || e.getMessage() == null) {
            return "未知错误";
        }
        return e.getMessage().trim();
    }

    // 其他异常处理方法（如需要）
}